package com.nenude.corejava.ch9;
public class ObjectClass {
	public static void main(String[] args) {

		// 新建三个字符串并判断其是否相同
		// 字符串创建的两种方式
		String s1 = "abc";// 放在常量池中
		String s2 = new String("abc");
		String s3 = new String("abc");
		String s4 = "abc";
		// ==运算符号：在判断对象（引用数据类型）时，它的功能是判断两个对象的地址是否相同
		// 常量池是java语言提供的一种特殊的内存结构，用于储存程序运行过程中的常量；可以储存常量对象；
		// System.out.println(s1==s2);
		// System.out.println(s2==s3);
		// System.out.println(s1==s4);

		// 字符串在储存时都会在常量池中进行保存，每个不同的字符串都会有自己的储存空间；
		String s5 = "abcd";
		// -----------------
		// 判断两个对象的数据值是否相等，即判断两个对象应该使用equals 方法
		// equals 方法时java.lang.object 类提供的方法，用于判断两个对象是否为同一对象或某些对象的值是否相等；
		// string 类重写了 equals方法
		// System.out.println(s1.equals(s2));
		// System.out.println(s2.equals(s3));
		// System.out.println(s1.equals(s4));
		// --------------
		Student student1 = new Student(1001, "jack");
		Student student2 = new Student(1001, "jack");
		Student student3 = student1;
		
		System.out.println(student1 == student2);
		System.out.println(student1.equals(student2));

		System.out.println(student1 == student3);
		System.out.println(student1.equals(student3));

		// hashCode 是哈希码，哈希码是通过哈希算法，为每一对象计算出的唯一值；即每个对象的hashCode不一样
		// equals 方法默认判断就是判断两个对象的哈希值是否相等（部分满足）；故equals 默认判断的是两个对象的引用是否指向的是同一个对象
		System.out.println("hashCode码");
		System.out.println(student1.hashCode());
		System.out.println(student2.hashCode());
		System.out.println(student3.hashCode());

		System.out.println("--------------------");
		// 当使用输出语句输出一个对象，默认会调用该对象的toString方法把对象转换成字符串进行输出
		// 默认输出对象的： 类名@hashCode(使用16进制表示)
		// 如果需要输出对象的数据，需要重写toString 方法
		System.out.println("重写tostring方法");
		System.out.println(student1 + ", " + student1.toString());
		System.out.println(student2 + ", " + student2.toString());
	}
}
